from typing import List, Dict, Union
from langchain.tools import tool
from utils.yaml_utils import save_test_cases
from utils.yaml_template import case_template
from langchain_community.document_loaders import UnstructuredFileLoader
from utils.data_utils import read_interface_datas_from_file
from utils.file_dir import get_doc_md_dir, get_xmind_file_dir
import xmind
import re



# 保存测试用例到文件系统的工具
@tool
def save_test_cases_to_file(test_cases: List[Dict], yaml_filename: str, py_filename: str) -> str:
    """
    保存测试用例到文件系统的工具

    参数:
    test_cases: 生成的测试用例列表（字典格式）
    yaml_filename: 保存的YAML文件名
    py_filename: 生成的测试文件名（不需要.py后缀）

    返回: 执行结果字符串
    """
    try:
        save_test_cases(test_cases, yaml_filename)
        case_template(yaml_filename, py_filename)
        return f"测试用例已保存到 {yaml_filename} 并生成测试文件 {py_filename}.py"
    except Exception as e:
        return f"文件保存失败: {str(e)}"


# 封装读取接口文档信息的工具
@tool
def read_and_extract_interfaces(file_path: str) -> str:
    """
        读取Markdown文件并提取接口信息
    :param file_path: .md文件的文件路径
    :return: 返回接口信息
    """
    return read_interface_datas_from_file(file_path)



# 封装读取需求文档的工具
@tool
def read_document_content(file_path: str) -> str:
    """
        读取功能需求文档中的信息
    :param file_path: 需求文档的路径
    :return: 返回需求文档的字符串信息
    """
    loader = UnstructuredFileLoader(get_doc_md_dir(file_path))
    documents = loader.load()

    # 2. 直接使用文档内容
    document_content = documents[0].page_content
    return document_content

# 封装测试用例生成后，存放为excel格式的测试用例工具


# 封装吧excel格式的测试用例转为xmind


# 封装把生成xmind格式的测试用例转为xmind
# 看看新的智能提取
@tool
def save_xmind_cases_to_file(input_text: str, output_file: str):
    """
    创建符合指定结构的XMind文件，步骤和预期结果拆分处理
    :param input_text: 包含测试用例的文本
    :param output_file: 输出的XMind文件名
    """
    try:
        # 创建新工作簿
        workbook = xmind.load(output_file)
        sheet = workbook.getPrimarySheet()

        # 设置根主题
        root_topic = sheet.getRootTopic()
        root_topic.setTitle("测试设计思维脑图")

        # 创建自定义节点
        custom_topic = root_topic.addSubTopic()
        custom_topic.setTitle("自定义:测试用例")

        # 解析文本并构建结构
        lines = [line.rstrip() for line in input_text.split('\n') if line.strip()]

        current_case_node = None  # 当前测试用例节点

        # 处理每一行
        for line in lines:
            # 跳过根节点行
            if line.strip() == "测试用例" or line.strip().startswith("根主题:"):
                continue

            # 统一将全角冒号替换为半角冒号
            content = line.strip().replace("：", ":")

            # 测试用例标题 (以TC开头)
            if content.startswith("TC"):
                # 提取用例描述部分
                parts = content.split(':', 1)
                if len(parts) < 2:
                    title = content
                else:
                    title = parts[1].strip()

                # 创建用例节点
                case_node = custom_topic.addSubTopic()
                case_node.setTitle(f"用例:{title}")
                current_case_node = case_node

            # 前提条件 (以"前置:"开头)
            elif current_case_node and content.startswith("前置:"):
                condition = content.replace("前置:", "", 1).strip()
                pre_condition = current_case_node.addSubTopic()
                pre_condition.setTitle(f"前置条件: {condition}")

            # 测试步骤和预期结果 (以"步骤:"开头，包含预期结果)
            elif current_case_node and content.startswith("步骤:"):
                # 提取步骤内容
                steps_content = content.replace("步骤:", "", 1).strip()

                # 处理竖线分隔符 - 替换为空字符串
                steps_content = steps_content.replace("|", "").strip()

                # 分割步骤和预期结果
                parts = re.split(r'(?:；|;)?\s*预期:', steps_content, maxsplit=1)
                step_text = parts[0].strip()
                expected_text = parts[1].strip() if len(parts) > 1 else ""

                # 创建步骤节点
                steps_node = current_case_node.addSubTopic()
                steps_node.setTitle(f"步骤: {step_text}")

                # 创建预期结果节点（作为步骤节点的子节点）
                if expected_text:
                    expected_node = steps_node.addSubTopic()
                    expected_node.setTitle(f"预期: {expected_text}")

        # 保存为XMind文件
        # xmind.save(workbook, path=output_file)
        xmind.save(workbook, path=get_xmind_file_dir(output_file))
        print(f"✅ 转换成功! XMind文件已生成: {output_file}")
        return output_file

    except Exception as e:
        print(f"❌ 转换过程中出错: {str(e)}")
        import traceback
        traceback.print_exc()
        return None

    finally:
        if output_file:
            print("✅ 转换成功！")
            print(f"请使用XMind软件打开生成的文件: {output_file}")
            print("文件结构说明：")
            print("- 根主题: 测试用例")
            print("- 测试用例: 以'TC'开头")
            print("- 前提条件: 以'前置:'开头")
            print("- 步骤: 以'步骤:'开头，包含所有步骤内容")
            print("- 预期: 以'预期:'开头，包含所有预期结果")
            print("- 步骤和预期结果在同一行显示")
        else:
            print("❌ 转换失败，请检查错误信息")


